﻿#region 版权信息
// ------------------------------------------------------------------------------
// Copyright: (c) 2029  成都A+有限公司 - Amm
// 项目名称：Amm.Common
// 文件名称：MD5Encrypt.cs
// 创建时间：2020100714:55
// 更改时间：2020100714:55
//  ------------------------------------------------------------------------------
#endregion

using System;
using System.Security.Cryptography;
using System.Text;

namespace Colorful.Furniture.Extensions
{
    /// <summary>
    ///  MD5加密
    /// </summary>
    public static class Md5Encrypt
    {
        /// <summary>
        /// 16位MD5加密
        /// </summary>
        /// <param name="password"></param>
        /// <returns></returns>
        public static string Encrypt16(this string password)
        {
            if (password.IsNull())
                return null;

            using (var md5 = MD5.Create())
            {
                return md5.ComputeHash(Encoding.UTF8.GetBytes(password)).ToHex();
            }
        }

        /// <summary>
        /// 32位MD5加密
        /// </summary>
        /// <param name="password"></param>
        /// <returns></returns>
        public static string Encrypt32(this string password)
        {
            if (password.IsNull())
                return null;

            using (var md5 = MD5.Create())
            {
                string pwd = string.Empty;
                byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password));
                foreach (var item in s)
                {
                    pwd = string.Concat(pwd, item.ToString("X"));
                }
                return pwd;
            }
        }

        /// <summary>
        /// 64位MD5加密
        /// </summary>
        /// <param name="password"></param>
        /// <returns></returns>
        public static string Encrypt64(this string password)
        {
            if (password.IsNull())
                return null;

            using (var md5 = MD5.Create())
            {
                byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password));
                return s.ToBase64();
            }
        }

        

        /// <summary>
        /// 32位 MD5 大写加密
        /// </summary>
        /// <param name="password"></param>
        /// <returns></returns>
        public static string Md5Encrypt32(string password = "")
        {
            string pwd = string.Empty;
            try
            {
                if (!string.IsNullOrEmpty(password) && !string.IsNullOrWhiteSpace(password))
                {
                    MD5 md5 = MD5.Create();//实例化一个 md5 对象
                    //加密后是一个字节类型的数组，这里要注意编码 UTF8/Unicode 的选择
                    byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password));
                    //通过使用循环，将字节类型的数组转换为字符串，此字符串是常规字符格式化后所得
                    foreach (var item in s)
                    {
                        //将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母，如果使用大写(X),则格式后的字符是大写字符
                        pwd = string.Concat(pwd, item.ToString("X2"));
                    }
                }
            }
            catch
            {
                throw new Exception($"错误的 password 字符串：{password}");
            }
            return pwd;
        }


        /// <summary>
        /// 32位 MD5 小写加密
        /// </summary>
        /// <param name="password"></param>
        /// <returns></returns>
        public static string Md5Encrypt32Small(string password = "")
        {
            string pwd = string.Empty;
            try
            {
                if (!string.IsNullOrEmpty(password) && !string.IsNullOrWhiteSpace(password))
                {
                    MD5 md5 = MD5.Create();//实例化一个 md5 对象
                    
                    //加密后是一个字节类型的数组，这里要注意编码 UTF8/Unicode 的选择
                    byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password));
                    //通过使用循环，将字节类型的数组转换为字符串，此字符串是常规字符格式化后所得
                    foreach (var item in s)
                    {
                        //将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母，如果使用大写(X),则格式后的字符是大写字符
                        pwd = string.Concat(pwd, item.ToString("x2"));
                    }
                }
            }
            catch
            {
                throw new Exception($"错误的 password 字符串：{password}");
            }
            return pwd;
        }


        /// <summary>
        /// 32位 MD5 大写加密
        /// </summary>
        /// <param name="password"></param>
        /// <returns></returns>
        public static string Md5Encrypt32Gb2312(string password = "")
        {
            string pwd = string.Empty;
            try
            {
                if (!string.IsNullOrEmpty(password) && !string.IsNullOrWhiteSpace(password))
                {
                    MD5 md5 = MD5.Create();//实例化一个 md5 对象
                    //加密后是一个字节类型的数组，这里要注意编码 UTF8/Unicode 的选择
                    byte[] s = md5.ComputeHash(Encoding.Unicode.GetBytes(password));
                    //通过使用循环，将字节类型的数组转换为字符串，此字符串是常规字符格式化后所得
                    foreach (var item in s)
                    {
                        //将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母，如果使用大写(X),则格式后的字符是大写字符
                        pwd = string.Concat(pwd, item.ToString("X2"));
                    }
                }
            }
            catch
            {
                throw new Exception($"错误的 password 字符串：{password}");
            }
            return pwd;
        }

        
    }
}